perm filename SORCE.SAI[PUB,TES]2 blob
sn#130588 filedate 1974-11-03 generic text, type T, neo UTF8
00100 BEGOF("SORCE")
00200
00300 COMMENT
00400
00500 *** Variations at Different Sites ***
00600
00700 SWICHFILE has to ignore the directory page on TV files at SU-AI.
00800 SORCE! differentiates file naming at TENEX sites. SORCE! also
00900 has an optional feature presently enabled only at PARC: if there is a
01000 file named MYPUB.DFS in the user directory, it is automatically
01100 REQUIREd after PUBSTD.DFS.
01200
01300 ***
01400
01500 Source switching and scanning module. The principal data structure
01600 is INPUTSTR, the current string being scanned. RD scans it and also
01700 replenishes it when exhausted. The INEST and SNEST arrays remember
01800 sources that have been pushed down due to macro calls, REQUIRE
01900 SOURCE!FILE, etc.
02000
02100 ;
02200
02300 PROCEDURES
00100 PUBLIC SIMPLE PROCEDURE SORCE! ;$"#
00200 BEGIN "SORCE!"
00300
00400 INPUTCHAN ← -1 ;
00500 INPUTSTR ← CRLF & "99999/99" & TB & TB &
00600 "<<)]"&RCBRAK&"⊃>>;END""PAST EOF"";END""PASSED EOF"";" ;
00700
00800 S ← TEXT!BRC ← CRLF & ALTMODE & RUBOUT & VT & " -.!?" ;
00900 WHILE FULSTR(S) DO DPB(LDB(SPCHAR(J ← LOP(S))), SPCODE(J)) ;
01000
01100 DEFN!BRC ← RCBRAK&"$)⊂⊃∃" & LF & LETTS ;
01200 LDEFN!BRC ← LENGTH(DEFN!BRC) ;
01300
01400 SETBREAK(TO!VT!SKIP, VT, NULL, "IS") ;
01500 SETBREAK(TO!COMMA!RPAR, ",)" & LF, CR, "IR") ;
01600 SETBREAK(TO!TERQ!CR, RCBRAK&";),]⊂"&CRLF, NULL, "IR") ;
01700 SETBREAK(TO!SEMI!SKIP, ";"&RCBRAK&""&LF, NULL, "IS") ;
01800 SETBREAK(NO!CHARS, NULL, NULL, "XRL");
01900 SETBREAK(ONE!CHAR, NULL, NULL, "XA") ;
02000 SETBREAK(TO!TB!FF!SKIP, TB&FF, LF, "IS") ;
02100 SETBREAK(TO!LF!TB!VT!SKIP, LF&TB&VT, FF, "ISL");
02200 SETBREAK(TO!VISIBLE, SP&CR, NULL, "XR") ;
02300 SETBREAK(ALPHA, LETTS&DIGS, NULL, "XR") ;
02400 SETBREAK(DIGITA, DIGS, NULL, "XR") ;
02500 SETBREAK(TO!QUOTE!APPD, """"&LF, NULL, "IA") ;
02600 SETBREAK(TO!NON!SP, SP, NULL, "XR") ;
02700 SETBREAK(TEXT!TBL, TEXT!BRC&SIG!BRC,NULL, "IS") ;
02800 SETBREAK(TO!VBAR!SKIP, "|"&LF, CR, "IS") ;
02900 SETBREAK(DEFN!TABLE, DEFN!BRC, NULL, "IS") ;
03000 SETBREAK(TO!CR!SKIP, CRLF, NULL, "IS") ;
03100
03200 SWICH(CRLF & "9999/98" & TB & TB &
03300 "CLOSE TEXT;AFTER TEXT⊂⊃;NEXT PAGE;END ""!MANUSCRIPT"" ",
03400 -1, 0) ;
03500 SWICHFILE(INFILE, INCHAN) ; comment main input file ;
03600
03700 IFC PARCVER OR ISIVER THENC RT01 10/25/74;
03800 BEGIN TES 1/22/74 OPTIONAL MYPUB.DFS ON USER DIRECTORY ;
03900 INTEGER CHAN ; EOF ← 0 ; CHAN ← GETCHAN ;
04000 OPEN(CHAN, "DSK", 0, 2, 0, 150, BRC, EOF) ;
04100 LOOKUP(CHAN, "MYPUB"&DFSEXT, FLAG) ;
04200 IF FLAG THEN RELEASE(CHAN)
04300 ELSE SWICHFILE("MYPUB"&DFSEXT,CHAN) ;
04400 END ;
04500 ENDC TES 1/22/74 ;
04600
04700 SWICH("BEGIN ""!MANUSCRIPT"" ", -1, 0) ;
04800
04900 PUBSTD ← TRUE ; COMMENT SUPPRESS PAGE NUMBER MONITORING ;
05000 IFC TENEX THENC
05100 SWICHF(LIBPPN & "PUBSTD"&DFSEXT) ;
05200 ELSEC
05300 SWICHF("PUBSTD"&DFSEXT&LIBPPN) ; comment standard modes and macros ;
05400 ENDC
05500
05600 END "SORCE!" ;
00100 PUBLIC SIMPLE PROCEDURE BURPINPUT(BOOLEAN VERBOSE) ;$"#
00200 BEGIN
00300 INTEGER L; STRING SL ;
00400 OUTSTR("LINE/PAGE "&ERRLINE&"/"&SRCPAGE&TB&
00500 SOMEINPUT[1 TO (IF VERBOSE THEN 300 ELSE 60)] ) ;
00600 OUTSTR(CRLF&" - - - - - - - - - - - - - - - - - - - -"&CRLF) ;
00700 FOR L ← LAST STEP -2 UNTIL (IF VERBOSE THEN 6 ELSE 6 MAX LAST-6) DO
00800 BEGIN
00900 SL ← LINESCAN(L) ;
01000 IF CHANSCAN(L) GEQ 0 THEN OUTSTR(SCAN(SL,TO!VT!SKIP,DUMMY)) ;
01100 OUTSTR(SP & SL & "/" & CVS(LH(DUMMY←ABS(PAGESCAN(L)))) & TB) ;
01200 OUTSTR(STRSCAN(L)[1 TO (IF VERBOSE THEN 300 ELSE 60)]) ;
01300 OUTSTR(CRLF&" - - - - - - - - - - - - - - - - - - - -"&CRLF) ;
01400 END ;
01500 END "BURPINPUT" ;
00100 PUBLIC SIMPLE PROCEDURE DREQUIRE ;$"#
00200 BEGIN
00300 STRING F ;
00400 PASS ; F ← E(NULL, "SOURCE!FILE") ;
00500 IF NOT EQU(THISWD[1 TO 6],"SOURCE") THEN
00600 WARN("=","REQUIRE -- SOURCE!FILE only!") ;
00650 IF NEXTS(FILE) THEN PASS ; TES 10/22/74 DWIM ;
00700 IF FULSTR(F) AND ON THEN SWICHF(F) ; PASS ;
00800 END "DREQUIRE" ;
00100 PUBLIC SIMPLE PROCEDURE GROWNESTS ;$"#
00200 BEGIN "GROWNESTS"
00300 GROW(INEST, INESTIDA, SIZE, 200, NULL) ; MAKEBE(INESTIDA, INEST) ;
00400 DUMMY ← 0 ; COMMENT OTHERWISE SPURIOUS MESSAGE FROM SGROW 2/28/73 TES ;
00500 SGROW(SNEST, SNESTIDA, DUMMY, 200, NULL) ; SMAKEBE(SNESTIDA, SNEST) ;
00600 ZEROSTRINGS(200, SNEST[SIZE-199]) ;
00700 END "GROWNESTS" ;
00100 PUBLIC STRING SIMPLE PROCEDURE RD(INTEGER BRKTBL) ;$"#
00200 BEGIN
00300 COMMENT INPUTSTR = [ [chars] LF line-no TB ]... [chars]
00400 All break tables should break on LF.
00500 RD's value is as if LF line-no TB were null. ;
00600 INTEGER PTR, BYTEWD ; STRING SPTR, RESULT, PART ;
00700 RESULT ← NULL ;
00800 DO BEGIN "PARTIAL"
00900 PART ← SCAN(INPUTSTR, BRKTBL, BRC) ;
01000 IF BRC = LF THEN
01100 BEGIN "MACRO LINE NUMBER"
01200 MACLINE ← SCAN(INPUTSTR, TO!TB!FF!SKIP, DUMMY) ;
01300 IF PART[∞ FOR 1] = LF THEN comment he Appended the break character ;
01400 PART ← IF DEFINING THEN PART & MACLINE & TB ELSE PART[1 TO ∞-1]
01500 ELSE IF DEFINING THEN PART ← PART & LF & MACLINE & TB ;
01600 END "MACRO LINE NUMBER"
01700 ELSE IF BRC = 0 THEN comment, ran out of input ;
01800 IF INPUTCHAN < 0 THEN INPUTSTR ← SWICHBACK comment, done scanning macro body ;
01900 ELSE BEGIN "FROM FILE"
02000 DO BEGIN comment, may be page marks or eof or more lines ;
02100 IF TECOFILE THEN
02200 BEGIN COMMENT CHECK FOR FF AND SUPERFLUOUS LFs ;
02300 SRCLINE ← CVS(CVD(SRCLINE)+1) ;
02400 INPUT(INPUTCHAN, NO!CHARS) ;
02500 WHILE BRC = LF DO
02600 BEGIN
02700 INPUT(INPUTCHAN,ONE!CHAR) ;
02800 INPUT(INPUTCHAN,NO!CHARS) ;
02900 END ;
03000 END
03100 ELSE SRCLINE ← INPUT(INPUTCHAN, TO!TB!FF!SKIP) ;
03200 IF BRC = FF THEN
03300 BEGIN "PGMARK"
03400 PAGEMARKS ← PAGEMARKS + 1 ;
03500 IF TECOFILE THEN
03600 BEGIN
03700 INPUT(INPUTCHAN, ONE!CHAR) ;
03800 SRCLINE ← "0" ;
03900 END ;
04000 WHILE INPGS AND LAST=4 AND BRC=FF AND PAGEMARKS>RH(INPG[INPGX]) DO
04100 IF (INPGX←INPGX+1)>INPGS THEN BEGIN BRC←0 ; EOF←1 END
04200 ELSE IF PAGEMARKS<(K←LH(INPG[INPGX])) THEN
04300 DO BEGIN "SKIP PAGES"
04400 DO INPUT(INPUTCHAN,TO!LF!TB!VT!SKIP)
04500 UNTIL BRC NEQ TB;
04600 IF BRC = LF THEN
04700 DO BEGIN
04800 SRCLINE←INPUT(INPUTCHAN,TO!TB!FF!SKIP);
04900 IF BRC=FF THEN PAGEMARKS←PAGEMARKS+1 ;
05000 END UNTIL BRC NEQ FF ;
05100 END "SKIP PAGES"
05200 UNTIL BRC NEQ TB OR PAGEMARKS GEQ K ;
05300 IF NOT EOF THEN
05400 BEGIN COMMENT COMPUTE AND DISPLAY PAGE NUMBER ;
05500 SRCPAGE ← CVS(PAGEMARKS) ;
05600 IF NOT PUBSTD THEN OUTSTR((
05700 IF SWDBACK THEN SPS(LAST-3)
05800 ELSE SP
05900 )&SRCPAGE) ;
06000 SWDBACK ← 0 ;
06100 END ;
06200 END "PGMARK" ;
06300 END
06400 UNTIL BRC NEQ FF ;
06500 MACLINE ← NULL ;
06600 IF EOF THEN INPUTSTR ← SWICHBACK comment, done scanning a SOURCE!FILE or gen-file;
06700 ELSE BEGIN "FILE LINE"
06800 DO BEGIN "EXPAND TABS"
06900 INPUTSTR ← INPUTSTR & INPUT(INPUTCHAN,TO!LF!TB!VT!SKIP) ;
07000 IF BRC=TB THEN INPUTSTR←INPUTSTR&
07100 (IF PAGESCAN(LAST) GEQ 0 THEN
07200 IF TABTAB=0 THEN
07300 SPS(8-LENGTH(INPUTSTR) MOD 8)
07400 ELSE TABTAB
07500 ELSE TB)
07600 ELSE IF BRC=VT THEN
07700 IF INPUTSTR[∞ FOR 1]=RCBRAK THEN INPUTSTR←INPUTSTR&VT
07800 ELSE
07900 BEGIN "GENVT" COMMENT MAYBE {PAGE!} IN GEN-FILE ;
08000 SPTR ← INPUT(INPUTCHAN, TO!VT!SKIP) ;
08100 IF (PTR ← CVD(SPTR)) GEQ TWO(14)
08200 AND LDB(PLIGHTWD(BYTEWD←ITBL[PTR-TWO(14)]))=2
08300 THEN
08400 BEGIN
08500 BREAKSET(LOCAL!TABLE,ALTMODE,"IS");
08600 BREAKSET(LOCAL!TABLE,NULL,"O");
08700 S ← STBL[LDB(IXWD(BYTEWD))] ;
08800 INPUTSTR ← INPUTSTR[1 TO ∞-6] &
08900 SCAN(S,LOCAL!TABLE,DUMMY);
09000 END
09100 ELSE INPUTSTR ← INPUTSTR & VT & SPTR & VT ;
09200 END "GENVT"
09300 END "EXPAND TABS"
09400 UNTIL BRC = LF OR BRC < 0 OR EOF ;
09500 IF BRC LEQ 0 THEN
09600 BEGIN BRC ← LF ;
09700 IF NOT EOF THEN
09800 WARN("=","Garbaged manuscript "&ERRLINE&"/"&SRCPAGE)
09900 END ;
10000 IF DEFINING THEN PART ← PART & LF & SRCLINE & "/" & SRCPAGE & TB ;
10100 END "FILE LINE" ;
10200 END "FROM FILE" ;
10300 IF BRC = LF THEN
10400 IF DEFINING THEN BEGIN BRC←0 ; IF INPUTSTR=!COMMAND!CHARACTER! THEN
10500 BEGIN PART ← PART & TB ; LOPP(INPUTSTR) ; END END
10600 ELSE IF INPUTSTR = !COMMAND!CHARACTER! OR INPUTSTR = TB THEN
10700 BEGIN
10800 LOPP(INPUTSTR) ;
10900 BRC ← 0 ; comment, keep scanning ;
11000 END
11100 ELSE INPUTSTR ← (BRC ← RCBRAK) & VT & INPUTSTR ;
11200 IF BRC THEN RETURN(IF LENGTH(RESULT)=0 THEN PART
11300 ELSE IF LENGTH(PART)=0 THEN RESULT
11400 ELSE RESULT & PART)
11500 ELSE IF LENGTH(RESULT)=0 THEN RESULT ← PART
11600 ELSE RESULT ← RESULT & PART ;
11700 END "PARTIAL"
11800 UNTIL FALSE ;
11900 END "RD" ;
00100 PUBLIC SIMPLE PROCEDURE SWICH(STRING NEWINPUTSTR; INTEGER NEWINPUTCHAN, ARGS) ;$"#
00200 BEGIN "SWICH" comment switch to new input stream ;
00300 IF ARGS THEN
00400 BEGIN "SUBSTITUTE"
00500 INTEGER BRC ; STRING NEWER ; NEWER ← NULL ; LAST ← LAST - ARGS ;
00600 DO BEGIN "VTABS"
00700 NEWER ← NEWER & SCAN(NEWINPUTSTR, TO!VT!SKIP, BRC) ;
00800 IF BRC THEN NEWER ← NEWER & SNEST[LAST + LOP(NEWINPUTSTR)] ;
00900 END "VTABS"
01000 UNTIL BRC = 0 ;
01100 NEWINPUTSTR ← NEWER ;
01200 END "SUBSTITUTE" ;
01300 IF (LAST ← LAST+2) > SIZE THEN GROWNESTS ;
01400 STRSCAN(LAST) ← IF THATISFULL THEN LIT!ENTITY & LIT!TRAIL & INPUTSTR ELSE INPUTSTR ;
01500 CHANSCAN(LAST) ← INPUTCHAN + (IF TECOFILE THEN 100 ELSE 0) ;
01600 LINESCAN(LAST) ← IF INPUTCHAN < 0 THEN MACLINE ELSE THISFILE & VT & SRCLINE ;
01700 PAGESCAN(LAST) ← LHRH(PAGEMARKS, PAGEWAS) ;
01800 EMPTYTHIS ; EMPTYTHAT ;
01900 INPUTSTR ← NEWINPUTSTR ; INPUTCHAN ← NEWINPUTCHAN ; TECOFILE ← 0 ;
02000 END "SWICH" ;
00100 PUBLIC STRING SIMPLE PROCEDURE SWICHBACK ;$"#
00200 BEGIN "SWICHBACK"
00300 EOF ← 0 ; IF INPUTCHAN GEQ 0 THEN
00400 BEGIN
00500 IF PUBSTD THEN PUBSTD ← FALSE
00600 ELSE IF SWFLG AND NOT SWDBACK THEN BEGIN OUTSTR("."&CRLF) ; SWDBACK←TRUE END ;
00700 RELEASE(INPUTCHAN) ;
00800 END
00900 ELSE IF CHANSCAN(LAST) LEQ -2 THEN RETURN(INPUTSTR←STRSCAN(LAST)) ;
01000 PAGEMARKS ← LH(DUMMY ← ABS(PAGESCAN(LAST))) ; PAGEWAS ← RH(DUMMY) ;
01100 SRCPAGE ← CVS(PAGEMARKS) ;
01200 IF (INPUTCHAN ← CHANSCAN(LAST))< 0 THEN MACLINE←LINESCAN(LAST)
01300 ELSE BEGIN SRCLINE←LINESCAN(LAST);
01400 THISFILE←SCAN(SRCLINE,TO!VT!SKIP,DUMMY) END ;
01500 IF TECOFILE ← INPUTCHAN > 50 THEN INPUTCHAN ← INPUTCHAN - 100 ;
01600 INPUTSTR ← STRSCAN(LAST) ; LAST←LAST-2; RETURN(INPUTSTR) ;
01700 END "SWICHBACK" ;
00100 PUBLIC SIMPLE PROCEDURE SWICHF(STRING FILENAME) ;$"#
00200 BEGIN "SWICHF"
00300 TES 8/24/74 PROCEDURIZED AND ALLOWED DEFAULTS ;
00400 INTEGER CHAN ;
00500 CHAN ← OPENTOREAD(0, IF AGENFILE THEN "Generated File " ELSE "Source!file ", FILENAME, REQEXT, REQPPN) ;
00600 SWICHFILE(FILENAME, CHAN) ;
00700 END "SWICHF" ;
00100 PRIVATE SIMPLE PROCEDURE SWICHFILE(STRING FILENAME ; INTEGER CHAN) ;$"#
00200 BEGIN COMMENT FILE ALREADY OPEN ON CHAN ;
00300 TES 1/22/74 SUBROUTINIZED ; TES 3/23/74 SIMPLIFIED ;
00400 SWICH(NULL, CHAN, 0) ;
00500 IF AGENFILE THEN BEGIN TECOFILE←0 ; AGENFILE←FALSE END
00600 ELSE BEGIN INPUT(INPUTCHAN, NO!CHARS) ; TECOFILE ← BRC GEQ 0 END ;
00700 PAGEMARKS ← PAGEWAS ← 1 ; SRCPAGE ← "1" ; SRCLINE ← IF TECOFILE THEN "0" ELSE "00000" ;
00800 IFC SAILVER THENC
00900 IF TECOFILE THEN
01000 BEGIN COMMENT IF TVEDIT FILE, SKIP PAGE 1 ;
01100 IF EQU("COMMENT ⊗", INPUT(INPUTCHAN,TO!TERQ!CR)[1 TO 9]) THEN
01200 BEGIN
01300 DO INPUT(INPUTCHAN, TO!TB!FF!SKIP) UNTIL BRC=FF ;
01400 SRCPAGE ← "2" ; PAGEMARKS ← PAGEWAS ← 2 ;
01500 END
01600 ELSE BEGIN CLOSIN(INPUTCHAN) ; COMMENT NOT TVEDIT -- RESTART INPUT ;
01700 LOOKUP(CHAN,FILENAME,FLAG);
01800 END END ;
01900 ENDC
02000 THISFILE ← FILENAME ;
02100 IF NOT PUBSTD THEN
02200 BEGIN
02300 IF LAST =4 AND SWFLG=0 THEN TES ADDED SWFLG 12/5/73 ;
02400 BEGIN MAINFILE←THISFILE ; SWFLG ← 1 END
02500 ELSE BEGIN IF NOT SWDBACK THEN OUTSTR(CRLF) ; OUTSTR(SPS(LAST-4)) ; END ;
02600 OUTSTR(THISFILE&SP&SRCPAGE) ; SWDBACK ← FALSE ;
02700 END ;
02800 END "SWICHFILE" ;
00100 FINISHED
00200
00300 ENDOF("SORCE")